/*
 * Copyright 2010 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
/*
 * Warning! This file is generated. Modify at your own risk.
 */

package com.google.api.services.calendar.model;

import com.google.api.client.json.GenericJson;
import com.google.api.client.util.DateTime;

/**
 * Model definition for Event.
 *
 * <p> This is the Java data model class that specifies how to parse/serialize into the JSON that is
 * transmitted over HTTP when working with the Calendar API. For a detailed explanation see:
 * <a href="http://code.google.com/p/google-api-java-client/wiki/Json">http://code.google.com/p/google-api-java-client/wiki/Json</a>
 * </p>
 *
 * <p>
 * Upgrade warning: starting with version 1.12 {@code getResponseHeaders()} is removed, instead use
 * {@link com.google.api.client.http.json.JsonHttpRequest#getLastResponseHeaders()}
 * </p>
 *
 * @author Google, Inc.
 */
@SuppressWarnings("javadoc")
public final class Event extends GenericJson {

  /**
   * The creator of the event. Read-only.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private Creator creator;

  /**
   * The organizer of the event. If the organizer is also an attendee, this is indicated with a
   * separate entry in 'attendees' with the 'organizer' field set to True. To change the organizer,
   * use the "move" operation. Read-only, except when importing an event.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private Organizer organizer;

  /**
   * Title of the event.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private String summary;

  /**
   * Identifier of the event.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private String id;

  /**
   * An absolute link to the Google+ hangout associated with this event. Read-only.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private String hangoutLink;

  /**
   * The attendees of the event.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.util.List<EventAttendee> attendees;

  static {
    // hack to force ProGuard to consider EventAttendee used, since otherwise it would be stripped out
    // see http://code.google.com/p/google-api-java-client/issues/detail?id=528
    com.google.api.client.util.Data.nullOf(EventAttendee.class);
  }

  /**
   * An absolute link to this event in the Google Calendar Web UI. Read-only.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private String htmlLink;

  /**
   * List of RRULE, EXRULE, RDATE and EXDATE lines for a recurring event. This field is omitted for
   * single events or instances of recurring events.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.util.List<String> recurrence;

  /**
   * The (inclusive) start time of the event. For a recurring event, this is the start time of the
   * first instance.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private EventDateTime start;

  /**
   * ETag of the resource.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private String etag;

  /**
   * Geographic location of the event as free-form text. Optional.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private String location;

  /**
   * For an instance of a recurring event, this is the event ID of the recurring event itself.
   * Immutable.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private String recurringEventId;

  /**
   * A gadget that extends this event.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private Gadget gadget;

  /**
   * Status of the event. Optional. Possible values are: - "confirmed" - The event is confirmed.
   * This is the default status.  - "tentative" - The event is tentatively confirmed.  - "cancelled"
   * - The event is cancelled.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private String status;

  /**
   * Last modification time of the event (as a RFC 3339 timestamp). Read-only.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private DateTime updated;

  /**
   * Description of the event. Optional.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private String description;

  /**
   * Event ID in the iCalendar format.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private String iCalUID;

  /**
   * Extended properties of the event.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private ExtendedProperties extendedProperties;

  /**
   * Whether the end time is actually unspecified. An end time is still provided for compatibility
   * reasons, even if this attribute is set to True. The default is False.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private Boolean endTimeUnspecified;

  /**
   * Sequence number as per iCalendar.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private Integer sequence;

  /**
   * Visibility of the event. Optional. Possible values are: - "default" - Uses the default
   * visibility for events on the calendar. This is the default value.  - "public" - The event is
   * public and event details are visible to all readers of the calendar.  - "private" - The event
   * is private and only event attendees may view event details.  - "confidential" - The event is
   * private. This value is provided for compatibility reasons.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private String visibility;

  /**
   * Whether attendees other than the organizer can modify the event. Optional. The default is
   * False.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private Boolean guestsCanModify;

  /**
   * The (exclusive) end time of the event. For a recurring event, this is the end time of the first
   * instance.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private EventDateTime end;

  /**
   * Whether attendees may have been omitted from the event's representation. When retrieving an
   * event, this may be due to a restriction specified by the 'maxAttendee' query parameter. When
   * updating an event, this can be used to only update the participant's response. Optional. The
   * default is False.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private Boolean attendeesOmitted;

  /**
   * Type of the resource ("calendar#event").
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private String kind;

  /**
   * Whether this is a locked event copy where no changes can be made to the main event fields
   * "summary", "description", "location", "start", "end" or "recurrence". The default is False.
   * Read-Only.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private Boolean locked;

  /**
   * Creation time of the event (as a RFC 3339 timestamp). Read-only.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private DateTime created;

  /**
   * The color of the event. This is an ID referring to an entry in the "event" section of the
   * colors definition (see the "colors" endpoint). Optional.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private String colorId;

  /**
   * Whether anyone can invite themselves to the event. Optional. The default is False.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private Boolean anyoneCanAddSelf;

  /**
   * Information about the event's reminders for the authenticated user.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private Reminders reminders;

  /**
   * Whether attendees other than the organizer can see who the event's attendees are. Optional. The
   * default is True.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private Boolean guestsCanSeeOtherGuests;

  /**
   * For an instance of a recurring event, this is the time at which this event would start
   * according to the recurrence data in the recurring event identified by recurringEventId.
   * Immutable.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private EventDateTime originalStartTime;

  /**
   * Whether attendees other than the organizer can invite others to the event. Optional. The
   * default is True.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private Boolean guestsCanInviteOthers;

  /**
   * Whether the event blocks time on the calendar. Optional. Possible values are: - "opaque" - The
   * event blocks time on the calendar. This is the default value.  - "transparent" - The event does
   * not block time on the calendar.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private String transparency;

  /**
   * Whether this is a private event copy where changes are not shared with other copies on other
   * calendars. Optional. Immutable.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private Boolean privateCopy;

  /**
   * The creator of the event. Read-only.
   * The value returned may be {@code null}.
   */
  public Creator getCreator() {
    return creator;
  }

  /**
   * The creator of the event. Read-only.
   * The value set may be {@code null}.
   */
  public Event setCreator(Creator creator) {
    this.creator = creator;
    return this;
  }

  /**
   * The organizer of the event. If the organizer is also an attendee, this is indicated with a
   * separate entry in 'attendees' with the 'organizer' field set to True. To change the organizer,
   * use the "move" operation. Read-only, except when importing an event.
   * The value returned may be {@code null}.
   */
  public Organizer getOrganizer() {
    return organizer;
  }

  /**
   * The organizer of the event. If the organizer is also an attendee, this is indicated with a
   * separate entry in 'attendees' with the 'organizer' field set to True. To change the organizer,
   * use the "move" operation. Read-only, except when importing an event.
   * The value set may be {@code null}.
   */
  public Event setOrganizer(Organizer organizer) {
    this.organizer = organizer;
    return this;
  }

  /**
   * Title of the event.
   * The value returned may be {@code null}.
   */
  public String getSummary() {
    return summary;
  }

  /**
   * Title of the event.
   * The value set may be {@code null}.
   */
  public Event setSummary(String summary) {
    this.summary = summary;
    return this;
  }

  /**
   * Identifier of the event.
   * The value returned may be {@code null}.
   */
  public String getId() {
    return id;
  }

  /**
   * Identifier of the event.
   * The value set may be {@code null}.
   */
  public Event setId(String id) {
    this.id = id;
    return this;
  }

  /**
   * An absolute link to the Google+ hangout associated with this event. Read-only.
   * The value returned may be {@code null}.
   */
  public String getHangoutLink() {
    return hangoutLink;
  }

  /**
   * An absolute link to the Google+ hangout associated with this event. Read-only.
   * The value set may be {@code null}.
   */
  public Event setHangoutLink(String hangoutLink) {
    this.hangoutLink = hangoutLink;
    return this;
  }

  /**
   * The attendees of the event.
   * The value returned may be {@code null}.
   */
  public java.util.List<EventAttendee> getAttendees() {
    return attendees;
  }

  /**
   * The attendees of the event.
   * The value set may be {@code null}.
   */
  public Event setAttendees(java.util.List<EventAttendee> attendees) {
    this.attendees = attendees;
    return this;
  }

  /**
   * An absolute link to this event in the Google Calendar Web UI. Read-only.
   * The value returned may be {@code null}.
   */
  public String getHtmlLink() {
    return htmlLink;
  }

  /**
   * An absolute link to this event in the Google Calendar Web UI. Read-only.
   * The value set may be {@code null}.
   */
  public Event setHtmlLink(String htmlLink) {
    this.htmlLink = htmlLink;
    return this;
  }

  /**
   * List of RRULE, EXRULE, RDATE and EXDATE lines for a recurring event. This field is omitted for
   * single events or instances of recurring events.
   * The value returned may be {@code null}.
   */
  public java.util.List<String> getRecurrence() {
    return recurrence;
  }

  /**
   * List of RRULE, EXRULE, RDATE and EXDATE lines for a recurring event. This field is omitted for
   * single events or instances of recurring events.
   * The value set may be {@code null}.
   */
  public Event setRecurrence(java.util.List<String> recurrence) {
    this.recurrence = recurrence;
    return this;
  }

  /**
   * The (inclusive) start time of the event. For a recurring event, this is the start time of the
   * first instance.
   * The value returned may be {@code null}.
   */
  public EventDateTime getStart() {
    return start;
  }

  /**
   * The (inclusive) start time of the event. For a recurring event, this is the start time of the
   * first instance.
   * The value set may be {@code null}.
   */
  public Event setStart(EventDateTime start) {
    this.start = start;
    return this;
  }

  /**
   * ETag of the resource.
   * The value returned may be {@code null}.
   */
  public String getEtag() {
    return etag;
  }

  /**
   * ETag of the resource.
   * The value set may be {@code null}.
   */
  public Event setEtag(String etag) {
    this.etag = etag;
    return this;
  }

  /**
   * Geographic location of the event as free-form text. Optional.
   * The value returned may be {@code null}.
   */
  public String getLocation() {
    return location;
  }

  /**
   * Geographic location of the event as free-form text. Optional.
   * The value set may be {@code null}.
   */
  public Event setLocation(String location) {
    this.location = location;
    return this;
  }

  /**
   * For an instance of a recurring event, this is the event ID of the recurring event itself.
   * Immutable.
   * The value returned may be {@code null}.
   */
  public String getRecurringEventId() {
    return recurringEventId;
  }

  /**
   * For an instance of a recurring event, this is the event ID of the recurring event itself.
   * Immutable.
   * The value set may be {@code null}.
   */
  public Event setRecurringEventId(String recurringEventId) {
    this.recurringEventId = recurringEventId;
    return this;
  }

  /**
   * A gadget that extends this event.
   * The value returned may be {@code null}.
   */
  public Gadget getGadget() {
    return gadget;
  }

  /**
   * A gadget that extends this event.
   * The value set may be {@code null}.
   */
  public Event setGadget(Gadget gadget) {
    this.gadget = gadget;
    return this;
  }

  /**
   * Status of the event. Optional. Possible values are: - "confirmed" - The event is confirmed.
   * This is the default status.  - "tentative" - The event is tentatively confirmed.  - "cancelled"
   * - The event is cancelled.
   * The value returned may be {@code null}.
   */
  public String getStatus() {
    return status;
  }

  /**
   * Status of the event. Optional. Possible values are: - "confirmed" - The event is confirmed.
   * This is the default status.  - "tentative" - The event is tentatively confirmed.  - "cancelled"
   * - The event is cancelled.
   * The value set may be {@code null}.
   */
  public Event setStatus(String status) {
    this.status = status;
    return this;
  }

  /**
   * Last modification time of the event (as a RFC 3339 timestamp). Read-only.
   * The value returned may be {@code null}.
   */
  public DateTime getUpdated() {
    return updated;
  }

  /**
   * Last modification time of the event (as a RFC 3339 timestamp). Read-only.
   * The value set may be {@code null}.
   */
  public Event setUpdated(DateTime updated) {
    this.updated = updated;
    return this;
  }

  /**
   * Description of the event. Optional.
   * The value returned may be {@code null}.
   */
  public String getDescription() {
    return description;
  }

  /**
   * Description of the event. Optional.
   * The value set may be {@code null}.
   */
  public Event setDescription(String description) {
    this.description = description;
    return this;
  }

  /**
   * Event ID in the iCalendar format.
   * The value returned may be {@code null}.
   */
  public String getICalUID() {
    return iCalUID;
  }

  /**
   * Event ID in the iCalendar format.
   * The value set may be {@code null}.
   */
  public Event setICalUID(String iCalUID) {
    this.iCalUID = iCalUID;
    return this;
  }

  /**
   * Extended properties of the event.
   * The value returned may be {@code null}.
   */
  public ExtendedProperties getExtendedProperties() {
    return extendedProperties;
  }

  /**
   * Extended properties of the event.
   * The value set may be {@code null}.
   */
  public Event setExtendedProperties(ExtendedProperties extendedProperties) {
    this.extendedProperties = extendedProperties;
    return this;
  }

  /**
   * Whether the end time is actually unspecified. An end time is still provided for compatibility
   * reasons, even if this attribute is set to True. The default is False.
   * The value returned may be {@code null}.
   */
  public Boolean getEndTimeUnspecified() {
    return endTimeUnspecified;
  }

  /**
   * Whether the end time is actually unspecified. An end time is still provided for compatibility
   * reasons, even if this attribute is set to True. The default is False.
   * The value set may be {@code null}.
   */
  public Event setEndTimeUnspecified(Boolean endTimeUnspecified) {
    this.endTimeUnspecified = endTimeUnspecified;
    return this;
  }

  /**
   * Sequence number as per iCalendar.
   * The value returned may be {@code null}.
   */
  public Integer getSequence() {
    return sequence;
  }

  /**
   * Sequence number as per iCalendar.
   * The value set may be {@code null}.
   */
  public Event setSequence(Integer sequence) {
    this.sequence = sequence;
    return this;
  }

  /**
   * Visibility of the event. Optional. Possible values are: - "default" - Uses the default
   * visibility for events on the calendar. This is the default value.  - "public" - The event is
   * public and event details are visible to all readers of the calendar.  - "private" - The event
   * is private and only event attendees may view event details.  - "confidential" - The event is
   * private. This value is provided for compatibility reasons.
   * The value returned may be {@code null}.
   */
  public String getVisibility() {
    return visibility;
  }

  /**
   * Visibility of the event. Optional. Possible values are: - "default" - Uses the default
   * visibility for events on the calendar. This is the default value.  - "public" - The event is
   * public and event details are visible to all readers of the calendar.  - "private" - The event
   * is private and only event attendees may view event details.  - "confidential" - The event is
   * private. This value is provided for compatibility reasons.
   * The value set may be {@code null}.
   */
  public Event setVisibility(String visibility) {
    this.visibility = visibility;
    return this;
  }

  /**
   * Whether attendees other than the organizer can modify the event. Optional. The default is
   * False.
   * The value returned may be {@code null}.
   */
  public Boolean getGuestsCanModify() {
    return guestsCanModify;
  }

  /**
   * Whether attendees other than the organizer can modify the event. Optional. The default is
   * False.
   * The value set may be {@code null}.
   */
  public Event setGuestsCanModify(Boolean guestsCanModify) {
    this.guestsCanModify = guestsCanModify;
    return this;
  }

  /**
   * The (exclusive) end time of the event. For a recurring event, this is the end time of the first
   * instance.
   * The value returned may be {@code null}.
   */
  public EventDateTime getEnd() {
    return end;
  }

  /**
   * The (exclusive) end time of the event. For a recurring event, this is the end time of the first
   * instance.
   * The value set may be {@code null}.
   */
  public Event setEnd(EventDateTime end) {
    this.end = end;
    return this;
  }

  /**
   * Whether attendees may have been omitted from the event's representation. When retrieving an
   * event, this may be due to a restriction specified by the 'maxAttendee' query parameter. When
   * updating an event, this can be used to only update the participant's response. Optional. The
   * default is False.
   * The value returned may be {@code null}.
   */
  public Boolean getAttendeesOmitted() {
    return attendeesOmitted;
  }

  /**
   * Whether attendees may have been omitted from the event's representation. When retrieving an
   * event, this may be due to a restriction specified by the 'maxAttendee' query parameter. When
   * updating an event, this can be used to only update the participant's response. Optional. The
   * default is False.
   * The value set may be {@code null}.
   */
  public Event setAttendeesOmitted(Boolean attendeesOmitted) {
    this.attendeesOmitted = attendeesOmitted;
    return this;
  }

  /**
   * Type of the resource ("calendar#event").
   * The value returned may be {@code null}.
   */
  public String getKind() {
    return kind;
  }

  /**
   * Type of the resource ("calendar#event").
   * The value set may be {@code null}.
   */
  public Event setKind(String kind) {
    this.kind = kind;
    return this;
  }

  /**
   * Whether this is a locked event copy where no changes can be made to the main event fields
   * "summary", "description", "location", "start", "end" or "recurrence". The default is False.
   * Read-Only.
   * The value returned may be {@code null}.
   */
  public Boolean getLocked() {
    return locked;
  }

  /**
   * Whether this is a locked event copy where no changes can be made to the main event fields
   * "summary", "description", "location", "start", "end" or "recurrence". The default is False.
   * Read-Only.
   * The value set may be {@code null}.
   */
  public Event setLocked(Boolean locked) {
    this.locked = locked;
    return this;
  }

  /**
   * Creation time of the event (as a RFC 3339 timestamp). Read-only.
   * The value returned may be {@code null}.
   */
  public DateTime getCreated() {
    return created;
  }

  /**
   * Creation time of the event (as a RFC 3339 timestamp). Read-only.
   * The value set may be {@code null}.
   */
  public Event setCreated(DateTime created) {
    this.created = created;
    return this;
  }

  /**
   * The color of the event. This is an ID referring to an entry in the "event" section of the
   * colors definition (see the "colors" endpoint). Optional.
   * The value returned may be {@code null}.
   */
  public String getColorId() {
    return colorId;
  }

  /**
   * The color of the event. This is an ID referring to an entry in the "event" section of the
   * colors definition (see the "colors" endpoint). Optional.
   * The value set may be {@code null}.
   */
  public Event setColorId(String colorId) {
    this.colorId = colorId;
    return this;
  }

  /**
   * Whether anyone can invite themselves to the event. Optional. The default is False.
   * The value returned may be {@code null}.
   */
  public Boolean getAnyoneCanAddSelf() {
    return anyoneCanAddSelf;
  }

  /**
   * Whether anyone can invite themselves to the event. Optional. The default is False.
   * The value set may be {@code null}.
   */
  public Event setAnyoneCanAddSelf(Boolean anyoneCanAddSelf) {
    this.anyoneCanAddSelf = anyoneCanAddSelf;
    return this;
  }

  /**
   * Information about the event's reminders for the authenticated user.
   * The value returned may be {@code null}.
   */
  public Reminders getReminders() {
    return reminders;
  }

  /**
   * Information about the event's reminders for the authenticated user.
   * The value set may be {@code null}.
   */
  public Event setReminders(Reminders reminders) {
    this.reminders = reminders;
    return this;
  }

  /**
   * Whether attendees other than the organizer can see who the event's attendees are. Optional. The
   * default is True.
   * The value returned may be {@code null}.
   */
  public Boolean getGuestsCanSeeOtherGuests() {
    return guestsCanSeeOtherGuests;
  }

  /**
   * Whether attendees other than the organizer can see who the event's attendees are. Optional. The
   * default is True.
   * The value set may be {@code null}.
   */
  public Event setGuestsCanSeeOtherGuests(Boolean guestsCanSeeOtherGuests) {
    this.guestsCanSeeOtherGuests = guestsCanSeeOtherGuests;
    return this;
  }

  /**
   * For an instance of a recurring event, this is the time at which this event would start
   * according to the recurrence data in the recurring event identified by recurringEventId.
   * Immutable.
   * The value returned may be {@code null}.
   */
  public EventDateTime getOriginalStartTime() {
    return originalStartTime;
  }

  /**
   * For an instance of a recurring event, this is the time at which this event would start
   * according to the recurrence data in the recurring event identified by recurringEventId.
   * Immutable.
   * The value set may be {@code null}.
   */
  public Event setOriginalStartTime(EventDateTime originalStartTime) {
    this.originalStartTime = originalStartTime;
    return this;
  }

  /**
   * Whether attendees other than the organizer can invite others to the event. Optional. The
   * default is True.
   * The value returned may be {@code null}.
   */
  public Boolean getGuestsCanInviteOthers() {
    return guestsCanInviteOthers;
  }

  /**
   * Whether attendees other than the organizer can invite others to the event. Optional. The
   * default is True.
   * The value set may be {@code null}.
   */
  public Event setGuestsCanInviteOthers(Boolean guestsCanInviteOthers) {
    this.guestsCanInviteOthers = guestsCanInviteOthers;
    return this;
  }

  /**
   * Whether the event blocks time on the calendar. Optional. Possible values are: - "opaque" - The
   * event blocks time on the calendar. This is the default value.  - "transparent" - The event does
   * not block time on the calendar.
   * The value returned may be {@code null}.
   */
  public String getTransparency() {
    return transparency;
  }

  /**
   * Whether the event blocks time on the calendar. Optional. Possible values are: - "opaque" - The
   * event blocks time on the calendar. This is the default value.  - "transparent" - The event does
   * not block time on the calendar.
   * The value set may be {@code null}.
   */
  public Event setTransparency(String transparency) {
    this.transparency = transparency;
    return this;
  }

  /**
   * Whether this is a private event copy where changes are not shared with other copies on other
   * calendars. Optional. Immutable.
   * The value returned may be {@code null}.
   */
  public Boolean getPrivateCopy() {
    return privateCopy;
  }

  /**
   * Whether this is a private event copy where changes are not shared with other copies on other
   * calendars. Optional. Immutable.
   * The value set may be {@code null}.
   */
  public Event setPrivateCopy(Boolean privateCopy) {
    this.privateCopy = privateCopy;
    return this;
  }

  /**
   * The creator of the event. Read-only.
   */
  public static final class Creator extends GenericJson {

    /**
     * Whether the creator corresponds to the calendar on which this copy of the event appears. Read-
     * only. The default is False.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private Boolean self;

    /**
     * The creator's name, if available.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private String displayName;

    /**
     * The creator's email address, if available.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private String email;

    /**
     * The creator's Profile ID, if available.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private String id;

    /**
     * Whether the creator corresponds to the calendar on which this copy of the event appears. Read-
     * only. The default is False.
     * The value returned may be {@code null}.
     */
    public Boolean getSelf() {
      return self;
    }

    /**
     * Whether the creator corresponds to the calendar on which this copy of the event appears. Read-
     * only. The default is False.
     * The value set may be {@code null}.
     */
    public Creator setSelf(Boolean self) {
      this.self = self;
      return this;
    }

    /**
     * The creator's name, if available.
     * The value returned may be {@code null}.
     */
    public String getDisplayName() {
      return displayName;
    }

    /**
     * The creator's name, if available.
     * The value set may be {@code null}.
     */
    public Creator setDisplayName(String displayName) {
      this.displayName = displayName;
      return this;
    }

    /**
     * The creator's email address, if available.
     * The value returned may be {@code null}.
     */
    public String getEmail() {
      return email;
    }

    /**
     * The creator's email address, if available.
     * The value set may be {@code null}.
     */
    public Creator setEmail(String email) {
      this.email = email;
      return this;
    }

    /**
     * The creator's Profile ID, if available.
     * The value returned may be {@code null}.
     */
    public String getId() {
      return id;
    }

    /**
     * The creator's Profile ID, if available.
     * The value set may be {@code null}.
     */
    public Creator setId(String id) {
      this.id = id;
      return this;
    }

  }

  /**
   * The organizer of the event. If the organizer is also an attendee, this is indicated with a
   * separate entry in 'attendees' with the 'organizer' field set to True. To change the organizer,
   * use the "move" operation. Read-only, except when importing an event.
   */
  public static final class Organizer extends GenericJson {

    /**
     * Whether the organizer corresponds to the calendar on which this copy of the event appears.
     * Read-only. The default is False.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private Boolean self;

    /**
     * The organizer's name, if available.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private String displayName;

    /**
     * The organizer's email address, if available.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private String email;

    /**
     * The organizer's Profile ID, if available.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private String id;

    /**
     * Whether the organizer corresponds to the calendar on which this copy of the event appears.
     * Read-only. The default is False.
     * The value returned may be {@code null}.
     */
    public Boolean getSelf() {
      return self;
    }

    /**
     * Whether the organizer corresponds to the calendar on which this copy of the event appears.
     * Read-only. The default is False.
     * The value set may be {@code null}.
     */
    public Organizer setSelf(Boolean self) {
      this.self = self;
      return this;
    }

    /**
     * The organizer's name, if available.
     * The value returned may be {@code null}.
     */
    public String getDisplayName() {
      return displayName;
    }

    /**
     * The organizer's name, if available.
     * The value set may be {@code null}.
     */
    public Organizer setDisplayName(String displayName) {
      this.displayName = displayName;
      return this;
    }

    /**
     * The organizer's email address, if available.
     * The value returned may be {@code null}.
     */
    public String getEmail() {
      return email;
    }

    /**
     * The organizer's email address, if available.
     * The value set may be {@code null}.
     */
    public Organizer setEmail(String email) {
      this.email = email;
      return this;
    }

    /**
     * The organizer's Profile ID, if available.
     * The value returned may be {@code null}.
     */
    public String getId() {
      return id;
    }

    /**
     * The organizer's Profile ID, if available.
     * The value set may be {@code null}.
     */
    public Organizer setId(String id) {
      this.id = id;
      return this;
    }

  }

  /**
   * A gadget that extends this event.
   */
  public static final class Gadget extends GenericJson {

    /**
     * Preferences.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.util.Map<String, String> preferences;

    /**
     * The gadget's title.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private String title;

    /**
     * The gadget's height in pixels. Optional.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private Integer height;

    /**
     * The gadget's width in pixels. Optional.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private Integer width;

    /**
     * The gadget's URL.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private String link;

    /**
     * The gadget's type.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private String type;

    /**
     * The gadget's display mode. Optional. Possible values are: - "icon" - The gadget displays next
     * to the event's title in the calendar view.  - "chip" - The gadget displays when the event is
     * clicked.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private String display;

    /**
     * The gadget's icon URL.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private String iconLink;

    /**
     * Preferences.
     * The value returned may be {@code null}.
     */
    public java.util.Map<String, String> getPreferences() {
      return preferences;
    }

    /**
     * Preferences.
     * The value set may be {@code null}.
     */
    public Gadget setPreferences(java.util.Map<String, String> preferences) {
      this.preferences = preferences;
      return this;
    }

    /**
     * The gadget's title.
     * The value returned may be {@code null}.
     */
    public String getTitle() {
      return title;
    }

    /**
     * The gadget's title.
     * The value set may be {@code null}.
     */
    public Gadget setTitle(String title) {
      this.title = title;
      return this;
    }

    /**
     * The gadget's height in pixels. Optional.
     * The value returned may be {@code null}.
     */
    public Integer getHeight() {
      return height;
    }

    /**
     * The gadget's height in pixels. Optional.
     * The value set may be {@code null}.
     */
    public Gadget setHeight(Integer height) {
      this.height = height;
      return this;
    }

    /**
     * The gadget's width in pixels. Optional.
     * The value returned may be {@code null}.
     */
    public Integer getWidth() {
      return width;
    }

    /**
     * The gadget's width in pixels. Optional.
     * The value set may be {@code null}.
     */
    public Gadget setWidth(Integer width) {
      this.width = width;
      return this;
    }

    /**
     * The gadget's URL.
     * The value returned may be {@code null}.
     */
    public String getLink() {
      return link;
    }

    /**
     * The gadget's URL.
     * The value set may be {@code null}.
     */
    public Gadget setLink(String link) {
      this.link = link;
      return this;
    }

    /**
     * The gadget's type.
     * The value returned may be {@code null}.
     */
    public String getType() {
      return type;
    }

    /**
     * The gadget's type.
     * The value set may be {@code null}.
     */
    public Gadget setType(String type) {
      this.type = type;
      return this;
    }

    /**
     * The gadget's display mode. Optional. Possible values are: - "icon" - The gadget displays next
     * to the event's title in the calendar view.  - "chip" - The gadget displays when the event is
     * clicked.
     * The value returned may be {@code null}.
     */
    public String getDisplay() {
      return display;
    }

    /**
     * The gadget's display mode. Optional. Possible values are: - "icon" - The gadget displays next
     * to the event's title in the calendar view.  - "chip" - The gadget displays when the event is
     * clicked.
     * The value set may be {@code null}.
     */
    public Gadget setDisplay(String display) {
      this.display = display;
      return this;
    }

    /**
     * The gadget's icon URL.
     * The value returned may be {@code null}.
     */
    public String getIconLink() {
      return iconLink;
    }

    /**
     * The gadget's icon URL.
     * The value set may be {@code null}.
     */
    public Gadget setIconLink(String iconLink) {
      this.iconLink = iconLink;
      return this;
    }

  }

  /**
   * Extended properties of the event.
   */
  public static final class ExtendedProperties extends GenericJson {

    /**
     * Properties that are shared between copies of the event on other attendees' calendars.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.util.Map<String, String> shared;

    /**
     * Properties that are private to the copy of the event that appears on this calendar.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key("private")
    private java.util.Map<String, String> calendarPrivate;

    /**
     * Properties that are shared between copies of the event on other attendees' calendars.
     * The value returned may be {@code null}.
     */
    public java.util.Map<String, String> getShared() {
      return shared;
    }

    /**
     * Properties that are shared between copies of the event on other attendees' calendars.
     * The value set may be {@code null}.
     */
    public ExtendedProperties setShared(java.util.Map<String, String> shared) {
      this.shared = shared;
      return this;
    }

    /**
     * Properties that are private to the copy of the event that appears on this calendar.
     * The value returned may be {@code null}.
     */
    public java.util.Map<String, String> getPrivate() {
      return calendarPrivate;
    }

    /**
     * Properties that are private to the copy of the event that appears on this calendar.
     * The value set may be {@code null}.
     */
    public ExtendedProperties setPrivate(java.util.Map<String, String> calendarPrivate) {
      this.calendarPrivate = calendarPrivate;
      return this;
    }

  }

  /**
   * Information about the event's reminders for the authenticated user.
   */
  public static final class Reminders extends GenericJson {

    /**
     * If the event doesn't use the default reminders, this lists the reminders specific to the event,
     * or, if not set, indicates that no reminders are set for this event.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private java.util.List<EventReminder> overrides;

    static {
      // hack to force ProGuard to consider EventReminder used, since otherwise it would be stripped out
      // see http://code.google.com/p/google-api-java-client/issues/detail?id=528
      com.google.api.client.util.Data.nullOf(EventReminder.class);
    }

    /**
     * Whether the default reminders of the calendar apply to the event.
     * The value may be {@code null}.
     */
    @com.google.api.client.util.Key
    private Boolean useDefault;

    /**
     * If the event doesn't use the default reminders, this lists the reminders specific to the event,
     * or, if not set, indicates that no reminders are set for this event.
     * The value returned may be {@code null}.
     */
    public java.util.List<EventReminder> getOverrides() {
      return overrides;
    }

    /**
     * If the event doesn't use the default reminders, this lists the reminders specific to the event,
     * or, if not set, indicates that no reminders are set for this event.
     * The value set may be {@code null}.
     */
    public Reminders setOverrides(java.util.List<EventReminder> overrides) {
      this.overrides = overrides;
      return this;
    }

    /**
     * Whether the default reminders of the calendar apply to the event.
     * The value returned may be {@code null}.
     */
    public Boolean getUseDefault() {
      return useDefault;
    }

    /**
     * Whether the default reminders of the calendar apply to the event.
     * The value set may be {@code null}.
     */
    public Reminders setUseDefault(Boolean useDefault) {
      this.useDefault = useDefault;
      return this;
    }

  }

}
